using System;
using System.Data;
using Mono.Data.SqliteClient;
using System.IO;
using System.Collections.Generic;

namespace rebidesCsharp
{
	class Rebides
	{
		CalculaDados calculos;
		
		public Rebides()
		{
				this.calculos = new CalculaDados();		
		}
		
		static void Main (string[] args)
		{
			StreamWriter s = File.CreateText("dataFile.txt");
			
			Rebides r = new Rebides();
			//r.nDocentesAno(s);
			//r.nDocentesEstabAno(s);
			//r.nDocentesGrauAno(s);
			//r.nDocentesEstabGrauAno(s);
			
			//r.nDoutoresEstabAno(s);
			//r.setDoutoresEstabAno(s);
			//r.setDocentesMudamEstabAno(s);
			
			//r.listEstabAno(s);
			//r.listDocentesGrauAno(s);	
			
			//r.listPersonnelLeaving(s);
			//r.listNewPersonnel(s);
			
			r.nDocentesMudaramEstab(s);
			
			s.Close();
		}
		
		/*
		 *  Chama a função que calcula o nº de docentes por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido. 
		 */
		public void nDocentesAno(StreamWriter f)
		{
			Console.WriteLine("##################### Numero Docentes por Ano #####################");
			f.WriteLine();
			f.WriteLine("##################### Numero Docentes por Ano #####################");
			f.WriteLine();
			
			List<int> lista = calculos.calculaNDocentesAno();
			
			for(int i = 0; i < lista.Count; i++)
			{
				Console.WriteLine("Ano 200" + i + " - " + lista[i]);
				f.WriteLine("Ano 200" + i + " - " + lista[i]);
			}
		}
		
		/*
		 *  Chama a função que calcula o nº de docentes por estabelecimento e por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido.
		 */
		public void nDocentesEstabAno(StreamWriter f)
		{
			Console.WriteLine();
			Console.WriteLine("##################### Numero Docentes por Estabelecimento e por Ano #####################");
			f.WriteLine();
			f.WriteLine("##################### Numero Docentes por Estabelecimento e por Ano #####################");
			f.WriteLine();
			
			Dictionary<string, Dictionary<string, int>> d = calculos.calculaNDocentesEstabelecimento();
			
			foreach (KeyValuePair<string, Dictionary<string, int>> item in d) 
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, int> d2 = d[item.Key];

                foreach (KeyValuePair<string, int> item2 in d2)
                {
                    Console.WriteLine(item2.Key + " -> " + d2[item2.Key]);
					f.WriteLine(item2.Key + " -> " + d2[item2.Key]);
                }
			}
		}
		
		/*
		 *  Chama a função que calcula o nº de docentes por grau e por ano.
		 * 	Nota: So calcula para os graus de licenciatura, mestrado e doutoramento
		 *  Imprime e escreve no ficheiro o resultado obtido.
		 */
		public void nDocentesGrauAno(StreamWriter f)
		{
			Console.WriteLine();
			Console.WriteLine("#################################Numero Docentes por Grau e por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Numero Docentes por Grau e por Ano#################################");
			f.WriteLine();
			
			Dictionary<string, Dictionary<string, int>> d = calculos.calculaNDocentesGrau();
			
			foreach (KeyValuePair<string, Dictionary<string, int>> item in d)
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, int> d2 = d[item.Key];

                foreach (KeyValuePair<string, int> item2 in d2)
                {
                    Console.WriteLine(item2.Key + " -> " + d2[item2.Key]);
					f.WriteLine(item2.Key + " -> " + d2[item2.Key]);
                }
			}
		}
		
		/*
		 *  Chama a função que calcula o nº de docentes por estabelecimento, grau e ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void nDocentesEstabGrauAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Numero Docentes por Estabelecimento, Grau e Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Numero Docentes por Estabelecimento, Grau e Ano#################################");
			f.WriteLine();
			
			Dictionary<string, Dictionary<string, Dictionary<string, int>>> d = calculos.calculaNDocentesEstabGrau();
			
			foreach (KeyValuePair<string, Dictionary<string, Dictionary<string, int>>> item in d)
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, Dictionary<string, int>> d2 = d[item.Key];

                foreach (KeyValuePair<string, Dictionary<string, int>> item2 in d2)
                {
					Console.WriteLine("GRAU: " + item2.Key);
					f.WriteLine();
					f.WriteLine("GRAU: " + item2.Key);
					f.WriteLine();
					
					Dictionary<string, int> d3 = d2[item2.Key];

                	foreach (KeyValuePair<string, int> item3 in d3)
               	 	{
						Console.WriteLine(item3.Key + " -> " + d3[item3.Key]);
						f.WriteLine(item3.Key + " -> " + d3[item3.Key]);
					}
                }
			}
			
		}
		
		/*
		 *  Chama a função que calcula o nº de docentes com doutoramento por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void nDoutoresEstabAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Numero Docentes com Doutoramento por Estabelecimento e por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Numero Docentes com Doutoramento por Estabelecimento e por Ano#################################");
			f.WriteLine();
			
			Dictionary<string, Dictionary<string, int>> d = calculos.calculaNDoutoresEstab();
			
			foreach (KeyValuePair<string, Dictionary<string, int>> item in d) 
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, int> d2 = d[item.Key];

                foreach (KeyValuePair<string, int> item2 in d2)
                {
                    Console.WriteLine(item2.Key + " -> " + d2[item2.Key]);
					f.WriteLine(item2.Key + " -> " + d2[item2.Key]);
                }
			}
		}
		
		/*
		 *  Chama a função que calcula o conjunto de docentes 
		 * 	doutores por estabelecimento e por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void setDoutoresEstabAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Docentes com Doutoramento por Estabelecimento e por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Docentes com Doutoramento por Estabelecimento e por Ano#################################");
			f.WriteLine();		
			
			Dictionary<string, Dictionary<string, List<string>>> d = calculos.calculaDoutoresEstab();
			
			foreach (KeyValuePair<string, Dictionary<string, List<string>>> item in d) 
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, List<string>> d2 = d[item.Key];
				
                foreach (KeyValuePair<string, List<string>> item2 in d2)
                {
					Console.WriteLine();
                    Console.WriteLine("ESTABELECIMENTO: " + item2.Key);
					f.WriteLine();
					f.WriteLine("ESTABELECIMENTO: " + item2.Key);
					f.WriteLine();
					
					List<string> listaDocentes = d2[item2.Key];
					
					foreach(string docente in listaDocentes)
					{
							Console.WriteLine(docente);
							f.WriteLine(docente);					
					}
                }
			}
		}
		
		/*
		 *  Chama a função que calcula o conjunto de docentes 
		 *  que mudaram de estabelecimento por ano.
		 */
		public void setDocentesMudamEstabAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Conjunto de Docentes que Mudaram de Estabececimento por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Conjunto de Docentes que Mudaram de Estabececimento por Ano#################################");
			f.WriteLine();		
			
			calculos.calculaConjuntoDocentesMudaramEstab(f);
		}
		
		/*
		 *  Chama a função que calcula a lista de estabelecimento por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void listEstabAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Lista de Estabelecimentos e por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Lista de Estabelecimentos e por Ano#################################");
			f.WriteLine();		
			
			Dictionary<string, List<string>> d = calculos.calculaListaEstab();
				
			foreach (KeyValuePair<string, List<string>> item in d) 
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				foreach(string names in item.Value) 
				{
					Console.WriteLine(names);
					f.WriteLine(names);
   				}
				
			}
		}
		
		/*
		 *  Chama a função que calcula a lista de docentes com o grau de 
		 * 	licenciatura, mestrado e doutoramento por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void listDocentesGrauAno(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Lista de detentores de um Grau por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Lista de detentores de um Grau por Ano#################################");
			f.WriteLine();		
			
			Dictionary<string, Dictionary<string, List<string>>> d = calculos.calculaListaDetentoresGrau();
			
			foreach (KeyValuePair<string, Dictionary<string, List<string>>> item in d) 
			{
				Console.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				f.WriteLine("------------ " + item.Key + " ------------");
				f.WriteLine();
				
				Dictionary<string, List<string>> d2 = d[item.Key];
				
                foreach (KeyValuePair<string, List<string>> item2 in d2)
                {
					Console.WriteLine();
                    Console.WriteLine("GRAU: " + item2.Key);
					f.WriteLine();
					f.WriteLine("GRAU: " + item2.Key);
					f.WriteLine();
					
					List<string> listaDocentes = d2[item2.Key];
					
					foreach(string docente in listaDocentes)
					{
							Console.WriteLine(docente);
							f.WriteLine(docente);					
					}
                }
			}			
		}
		
		/*
		 *  Chama a função que calcula a lista docentes que deixaram a instituição por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void listPersonnelLeaving(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Lista de Docentes que Deixaram a Instituicao por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Lista de Docentes que Deixaram a Instituicao por Ano#################################");
			f.WriteLine();		
			
			calculos.calculaListaDocentesMudaramInst(f);
		}
		
		/*
		 *  Chama a função que calcula a lista docentes novos na instituição por ano.
		 *  Imprime e escreve no ficheiro o resultado obtido 
		 */
		public void listNewPersonnel(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Lista de Docentes Novos na Instituicao por Ano#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Lista de Docentes Novos na Instituicao por Ano#################################");
			f.WriteLine();		
			
			calculos.calculaListaDocentesNovosInst(f);
		}
		
		/*
		 *  Chama a função que calcula o numero de docentes que migaram 
		 * 	de um estabelecimento para outro por ano.
		 */
		public void nDocentesMudaramEstab(StreamWriter f){
			Console.WriteLine();
			Console.WriteLine("#################################Numero de Docentes que mudaram de um Estabelecimento para outro#################################");
			
			f.WriteLine();
			f.WriteLine("###################################Numero de Docentes que mudaram de um Estabelecimento para outro#################################");
			f.WriteLine();		
			
			calculos.calculaNDocentesMudaramEstab(f);
		}
		
		
	}//end Class Rebides
}//end namespace
